package com.wanxi.order.core;



import com.wanxi.domain.code.ResultCode;
import com.wanxi.domain.vo.OrderQueryVO;
import com.wanxi.domain.vo.OrderVO;
import com.wanxi.domain.vo.PlaceOrderVO;
import com.wanxi.order.service.OrderService;
import com.wanxi.util.OrderStatusConverter;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @Author LiuYuRong
 * @Date 2021/12/25 9:21
 * @Version 1.0
 * @Description
 */
@RestController
@RequestMapping("/order")
@Api(tags = "订单原子层设计")

public class OrderCore {
    @Autowired
    private OrderService orderService;

//    @Autowired
//    private OrderCore core;



    /**
     * 接收 当前页数和每页条数，返回一个订单列表
     * @param role 角色身份 必填
     * @param roleId 角色ID 必填
     * @param vo 查询条件，在这里可以指定分页，如果不指定（分页），默认返回头10条数据
     * @return 订单视图列表
     */
    @ApiOperation("后台订单列表")
    @GetMapping("/getOrderLists/{roleId}/{role}")
    public List<OrderVO> getOrders(@ApiParam("roleId表示角色Id必选，role表示角色身份，必选,QueryVo查询条件可选项") @PathVariable int roleId, @PathVariable int role, @RequestBody OrderQueryVO vo){



        return orderService.getOrders(roleId, role,vo);

    }


    /**
     * 用户下单
     * @param order 订单实体类，下单所需资料
     * @return ResultCode，下单成功或者失败
     */

    @ApiOperation("用户下单")
    @PutMapping("/placeOrder/")
    public ResultCode addOrder(@RequestBody PlaceOrderVO order){
        int i= orderService.addOrder(order);
        if (i==1) return  ResultCode.SUCCESS;
        else return ResultCode.FAILED;
    }

    /**
     * 修改订单状态。
     * 未支付——>已支付 0-》1
     * 未发货——>已发货 1-》2
     * 未收货——>已收货 2-》3
     * 其他状态 4
     * @param orderId 订单编号
     * @param status 订单状态
     * @return
     */
    @ApiOperation("改变订单状态，调整订单状态为已发货；用户收货，调整为已收货")
    @PutMapping("/changeStatus/{orderId}/{status}")
    public ResultCode changeOrderStatus(@PathVariable long orderId,@PathVariable int status){
        OrderStatusConverter converter=new OrderStatusConverter();
        return orderService.changeOrderStatus(orderId,converter.convert(status));
    }



    /**
     * 传入一个订单号，返回是否执行成功的结果，
     * 这个方法会调用相关支付接口并修改订单状态为已支付
     * @param orderId 订单ID
     * @return  支付路径跳转
     */
    @ApiOperation("订单支付")
    @PutMapping("/pay/{orderId}")
    public com.wanxi.domain.code.ResultCode payOrder(@PathVariable long orderId){

        int i = orderService.payOrder(orderId);

        return null;
    }


    /**
     * 获得一个订单号，删除对应的订单，并返回订单是否删除成功的状态码
     * 只是逻辑上的删除，也就是设置特定列数值搜索不到
     * @param orderId 订单编号
     * @return 状态码
     */
    @ApiOperation("删除订单")
    @DeleteMapping("/delete/{orderId}")
    public ResultCode deleteOrder(@PathVariable long orderId){

        return orderService.deleteOrder(orderId);
    }

    /**
     * 需要在确认订单前调用这个方法计算出订单实际付款
     * @param orderVO 订单视图
     * @return 计算好的金额，key为amount
     */
    @ApiOperation("在提交前执行，会计算出订单的总价格和优惠价并返回")
    @PostMapping("/beforeSubmitOrder/")
    Map<String,Object> beforeSubmitOrder(PlaceOrderVO orderVO){
        return orderService.beforeSubmitOrder(orderVO);
    }

















}
